
#include "avpacket_list.h"
#include <mutex>

namespace lcf
{
    // 因为pkt是外部传入的，为了保证安全性，需要新创建一个dst_packet后再push到pkts_中
    void AVPacketList::Push(AVPacket *pkt)
    {
        std::unique_lock<std::mutex> lock(mtx_);
        // 生成新的AVPacket 对象 引用计数+1;
        auto dst_packet = av_packet_alloc();
        av_packet_ref(dst_packet, pkt); // 引用计数 减少数据复制，线程安全
        pkts_.push_back(dst_packet);

        // 超出最大空间，清理数据，到关键帧位置
        if (pkts_.size() > maxPackets_)
        {
            // 处理第一帧
            if (pkts_.front()->flags & AV_PKT_FLAG_KEY) // 关键帧
            {
                av_packet_free(&pkts_.front()); // 清理
                pkts_.pop_front();              // 出队
                return;
            }
            // 清理所有非关键帧之前的数据
            while (!pkts_.empty())
            {
                if (pkts_.front()->flags & AV_PKT_FLAG_KEY) // 关键帧
                {
                    return;
                }
                av_packet_free(&pkts_.front()); // 清理
                pkts_.pop_front();              // 出队
            }
        }
    }

    AVPacket *AVPacketList::Pop()
    {
        std::unique_lock<std::mutex> lock(mtx_);
        if (pkts_.empty())
            return nullptr;
        auto pkt = pkts_.front();
        pkts_.pop_front();
        return pkt;
    }

    int AVPacketList::Size()
    {
        std::unique_lock<std::mutex> lock(mtx_);
        return pkts_.size();
    }

    void AVPacketList::Clear()
    {
        std::unique_lock<std::mutex> lock(mtx_);
        while (!pkts_.empty())
        {
            av_packet_free(&pkts_.front());
            pkts_.pop_front();
        }
    }

}
